package com.xxx.config;

import com.alibaba.druid.util.StringUtils;
import com.xxx.utils.Jwt;
import io.jsonwebtoken.Claims;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.security.SignatureException;

@Component
public class TokenInterceptor implements HandlerInterceptor {

    @Autowired
    private Jwt jwt;

    // 原始方法调用前执行的内容
    @Override
    public boolean preHandle(HttpServletRequest request,
                             HttpServletResponse response,
                             Object handler) throws SignatureException {
        /** Token 验证 */
        String token = request.getHeader(jwt.getHeader());
        // 检查字符串是否为 null 或长度为 0
        if(StringUtils.isEmpty(token)){
            token = request.getParameter(jwt.getHeader());
        }
        if(StringUtils.isEmpty(token)){
            throw new SignatureException(jwt.getHeader()+ "不能为空");
        }

        // Claims 来自 io.jsonwebtoken.Claims，这是由 Java JWT 库（jjwt） 提供的一个接口，专门用于解析和操作 JWT 中的声明数据
        Claims claims = null;
        try{
            claims = jwt.getTokenClaim(token);
            if(claims == null || jwt.isTokenExpired(claims.getExpiration())){
                throw new SignatureException(jwt.getHeader() + "失效，请重新登录。");
            }
        }catch (Exception e){
            throw new SignatureException(jwt.getHeader() + "失效，请重新登录。");
        }

        // claims.getSubject(): 获取 Token 中的主体信息（通常是用户 ID 或唯一标识）
        // request.setAttribute: 将用户身份信息存储到请求对象中，方便后续的业务逻辑访问
        request.setAttribute("identityId", claims.getSubject());
        return true;
    }
}